//
// Created by denglibin on 19-4-13.
//
/**
 * exec系列系统调用：
 *  其实没有单一的exec系统调用，它们由基于单个系统调用的一组exec函数构成。
 *  execl():
 *      int execl (const char *path, const char *arg, ...);
        对 execl() 的调用会将path所指路径的载入的映内存，替换当前进程的映。 arg是它的地一个参数，‘
        省略号意味着可变长度的参数列表，额外的参数  会在后面一个接着一个。但参数列表必须是以NULL结尾。
        例如，下面的代码会用/bin/vi替代当前运行的程序：
        int ret;
        ret = execl("/bin/vi", "vi", NULL);
        if(ret == -1){
            perror("execl");
        }

       如果想边界/home/kidd/hooks.txt文件，可以执行如下代码：
        int ret;
        ret = execl("/bin/vi", "vi", "/home/kidd/hooks.txt", NULL);

    其他exec系列系统调用：
        int execlp (const char *file, const char *arg, ...);
        int execle (const char *path, const char *arg, ..., char * const envp[]);

        int execv (const char *path, char *const argv[]);
        int execvp (const char *file, char *const argv[]);
        int execve (const char *filename, char *const argv[], char *const envp[]);

        l：参数以列表  的形式提供
        v：参数以数组的形式提供
        p：在用户环境变量中寻找可执行文件
        e：表示会提供给新进程以新的环境变量

    返回：成功时不会返回，当失败时返回-1，并设置errno
 */
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
static int main_(void){
    int ret;
    pid_t current_pid = getpid();
    pid_t parent_pid = getppid();
    printf("当前进程id:%d\n", current_pid);
    printf("父进程id:%d\n", parent_pid);
   // ret = execl("/home/denglibin/data2/demo", "demo", "hello world",NULL);
    //ret = execlp("vim", "/home/denglibin/data2.txt",NULL);

    char * env[]={"AA=12", NULL};
   // ret = execle("/home/denglibin/data2/demo", "demo", "hello world",NULL, env);

   char * argc[] = {"ls", "-l", "/home/denglibin", NULL};
  // ret = execv("/bin/ls",argc);
     ret = execvp("ls", argc);
    //ret = execve("/bin/ls", argc, env);

    if(ret == -1){
        perror("execl");
        return -1;
    }
    return 0;
}













